package edu.tfh.s2.ehkbot.daten;

import java.util.Vector;

import edu.tfh.s2.ehkbot.steuerung.BusAdresse;

/**
 * AdressenDispatcher verteilt BusAdressen anhand des Modul und Objekt Name. Dadruch vermeidet man eine zu
 * enge Koplung zwischen Quelltext und BusAdressen.
 * 
 * @author s2zehn
 */
public class AdressenDispatcher {

	/**
	 * Speichert zur jeder BusAdresse Modul und Objekt Name.
	 */
	private class Zuweisung {
		private BusAdresse busAdresse;
		private String modul;
		private String name;

		public Zuweisung(String modul, String name, BusAdresse busAdresse) {
			this.modul = modul;
			this.name = name;
			this.busAdresse = busAdresse;
		}
	}

	static private AdressenDispatcher instance = null;

	/**
	 * getInstance() Singelton Methode.
	 * 
	 * @return Die Einzigeste Instanz von AdressenDispatcher
	 */
	static public AdressenDispatcher getInstance() {
		if (instance == null)
			instance = new AdressenDispatcher();
		return instance;
	}

	/**
	 * Die Datenbank in der die Zuweisungen abgespeichert werden.
	 */
	private Vector<Zuweisung> zuweisung = new Vector<Zuweisung>();

	/**
	 * Privater Konstruktor, siehe Singelton Pattern.
	 */
	private AdressenDispatcher() {
	}

	/**
	 * Liefert eine Adresse für ein Objekt welches sich in ein Modul befindet.
	 * 
	 * @param modulName
	 *            Der Modul Name aus den die BusAdresse abgeleitet wird.
	 * @param name
	 *            Der Objekt Name aus den die BusAdresse abgeleitet wird.
	 * @return Die zum Modul und Objekt passende BusAdresse.
	 */
	public BusAdresse getAdresseFor(String modul, String name) {
		BusAdresse busA = new BusAdresse(modul.hashCode(), name.hashCode());
		Zuweisung zw = new Zuweisung(modul, name, busA);
		zuweisung.add(zw);
		return zw.busAdresse;
	}

	/**
	 * Sucht in der Datenbank nach den Modul Namen für eine vergebene BusAdresse.
	 * 
	 * @param busAdresse
	 *            Danach wird in der Datenbank gesucht.
	 * @return null wenn BusAdresse nicht in Datenbank ist
	 */
	public String getModulForAdresse(BusAdresse busAdresse) {
		Zuweisung zw = getZuweisungForAdresse(busAdresse);
		if (zw == null)
			return null;
		else
			return zw.modul;
	}

	/**
	 * Sucht in der Datenbank nach den Objekt Namen für eine vergebene BusAdresse.
	 * 
	 * @param busAdresse
	 *            Danach wird in der Datenbank gesucht.
	 * @return null wenn BusAdresse nicht in Datenbank ist
	 */
	public String getNameForAdresse(BusAdresse busAdresse) {
		Zuweisung zw = getZuweisungForAdresse(busAdresse);
		if (zw == null)
			return null;
		else
			return zw.name;
	}

	/**
	 * Hilfsfunktion für getNameForAdresse und getModulForAdresse.
	 * 
	 * @param busAdresse
	 *            Danach wird in der Datenbank gesucht.
	 * @return null wenn BusAdresse nicht in Datenbank ist
	 */
	private Zuweisung getZuweisungForAdresse(BusAdresse busAdresse) {
		for (int i = 0; i < zuweisung.size(); ++i) {
			if (zuweisung.get(i).busAdresse.equals(busAdresse))
				return zuweisung.get(i);
		}
		return null;
	}

}
